#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
const int M = 1e5 + 10;

int n, m, l, vv;
int tantou[N], qwq[M]; 
struct Node {
    int d, v, a;
} car[M];
struct qujian {
	int lef, rig;
} aa[M];

bool cmp(qujian x, qujian y)
{
    return x.rig < y.rig;
}

void fre()
{
	freopen("detect.in", "r", stdin);
	freopen("detect.out", "w", stdout);
}

int main()
{
	fre();
	int T; cin >> T;
	while (T -- )
	{
		for (int i = 0; i <= 1000005; i ++ )
			tantou[i] = 0;
		
        cin >> n >> m >> l >> vv;
		for (int i = 1; i <= n; i ++ )
			cin >> car[i].d >> car[i].v >> car[i].a;

		for (int i = 1; i <= m; i ++ )
		{
			cin >> qwq[i];
			tantou[qwq[i]] ++ ;
		}

		for (int i = 1; i <= l; i ++ )
			tantou[i] += tantou[i - 1];

		int cnt = 0;
		for (int i = 1; i <= n; i ++ )
		{
			int d = car[i].d, av = car[i].v, a = car[i].a;
			if (a == 0)
			{
                if (av > vv)
                {
                    if (d != 0 && tantou[l] - tantou[d - 1] > 0)
                    {
						cnt ++ ;
						aa[cnt].lef = d;
                        aa[cnt].rig = l;
					}
                    if (d == 0 && tantou[l] > 0) 
                    {
                        cnt ++ ;
                        aa[cnt].lef = d;
                        aa[cnt].rig = l;
                    }
                }
			}
			if (a < 0)
			{
                a = -a;
                if (av > vv)
                {
                    if ((av * av - vv * vv) % (2 * a) == 0)
                    {
                        int nd = d + (av * av - vv * vv) / (2 * a);
                        if (nd <= l)
                        {
                            if (tantou[nd - 1] - tantou[d - 1] > 0)
                            {
                                cnt ++ ;
                                aa[cnt].lef = d;
                                aa[cnt].rig = nd - 1;
                            }
                        }
                        else
                        {
                            if (tantou[l] - tantou[d - 1] > 0)
                            {
                                cnt ++ ;
                                aa[cnt].lef = d;
                                aa[cnt].rig = l;
                            }
                        }
                    }
                    else
                    {
                        int nd = d + ceil((av * av - vv * vv) * 1.0 / (2 * a));
                        if (nd <= l)
                        {
                            if (tantou[nd - 1] - tantou[d - 1] > 0)
                            {
                                cnt ++ ;
                                aa[cnt].lef = d;
                                aa[cnt].rig = nd - 1;
                            }
                        }
                        else
                        {
                            if (tantou[l] - tantou[d - 1] > 0)
                            {
                                cnt ++ ;
                                aa[cnt].lef = d;
                                aa[cnt].rig = l;
                            }
                        }
                    }
                }
                a = -a;
			}
			if (a > 0)
			{
                if (av > vv)
                {
                    if (d != 0 && tantou[l] - tantou[d - 1] > 0)
                    {
						cnt ++ ;
						aa[cnt].lef = d;
                        aa[cnt].rig = l;
					}
                    if (d == 0 && tantou[l] > 0)
                    {
						cnt ++ ;
						aa[cnt].lef = d;
                        aa[cnt].rig = l;
					}
                }
                else if (av == vv)
                {
                    if (tantou[l] - tantou[d] > 0)
                    {
						cnt ++ ;
						aa[cnt].lef = d + 1;
                        aa[cnt].rig = l;
                    }
                }
                else
                {
					if ((vv * vv - av * av) % (2 * a) == 0)
                    {
                        int nd = d + (vv * vv - av * av) / (2 * a);
						if (nd >= l) continue;
                        if (tantou[l] - tantou[nd] > 0)
                        {
						    cnt ++ ;
						    aa[cnt].lef = nd + 1;
                            aa[cnt].rig = l;
					    }
                    }
                    else
                    {
                        int nd = d + ceil((vv * vv - av * av) * 1.0 / (2 * a));
                        if (nd > l) continue;
                        if (tantou[l] - tantou[nd - 1] > 0)
                        {
                            cnt ++ ;
                            aa[cnt].lef = nd;
                            aa[cnt].rig = l;
                        }
                    }
                }
			}
		}
        cout << cnt << " ";
        if (cnt == 0) cout << m << endl;
        else
        {
			sort(aa + 1, aa + cnt + 1, cmp);
			int t = upper_bound(qwq + 1, qwq + m + 1, aa[1].rig) - qwq;
			int res = 1, pos = qwq[t - 1];
			for (int i = 2; i <= cnt; i ++ )
				if (aa[i].lef > pos)
				{
					int t = upper_bound(qwq + 1, qwq + m + 1, aa[i].rig) - qwq;
					pos = qwq[t - 1]; res ++ ;
				}
			cout << m - res << endl;
		}
	}
	return 0;
}
